/**
 * CRUD的基础用法
 */
package controllers

import (
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
	"fmt"
)


func init() {
	orm.RegisterDriver("mysql", orm.DRMySQL)
	orm.RegisterDataBase("default", "mysql", "root:@tcp(127.0.0.1:3306)/imooc?charset=utf8&parseTime=True&loc=Local")
	orm.RegisterModel(new(User))
}


type MainController struct {
	beego.Controller
}


type User struct{
	Id int64  
	Name string
	Gender int
	Age int
}



func (c *MainController) Get() {
	
	o := orm.NewOrm()

	//插入一条数据
	// user := User{Name:"nihao",Gender:1,Age:28}
	// id, err := o.Insert(&user)
	// c.Ctx.WriteString(fmt.Sprintf("ID: %d, ERR: %v\n", id, err))



	//插入多条
	// users := []User{
	//     {Name: "slene",Gender:1,Age:28},
	//     {Name: "astaxie",Gender:1,Age:28},
	//     {Name: "unknown",Gender:1,Age:28},
	// }
	/*第一个参数 bulk 为并列插入的数量，第二个为对象的slice*/
	// successNums, err := o.InsertMulti(3, users) 
	// if err != nil{
	// 	return
	// }
	// c.Ctx.WriteString(fmt.Sprintf("num: %d", successNums))


	//读取一条   条件只能是修改主键Id
	// user := User{Id:1}
	// err := o.Read(&user)
	// 	if err == orm.ErrNoRows {
	//    c.Ctx.WriteString(fmt.Sprintf("查询不到"))
	// } else if err == orm.ErrMissPK {
	//     c.Ctx.WriteString(fmt.Sprintf("找不到主键"))
	// } else {
	// 	c.Ctx.WriteString(fmt.Sprintf("ID: %d, Name: %v\n", user.Id, user.Name))
	// }
	

	//判断存在不存在不存在则添加数据 
	// user := User{Name: "slene2"}
	// user.Age = 32
	// user.Gender = 1
	// // 三个返回参数依次为：是否新创建的，对象 Id 值，错误
	// if created, id, err := o.ReadOrCreate(&user, "Name"); err == nil {
	//     if created {
	//         c.Ctx.WriteString(fmt.Sprintf("New Insert an object. Id: %v", id))
	//     } else {
	//         c.Ctx.WriteString(fmt.Sprintf("Get an object. Id: %v", id))
	//     }
	// }





	//更新 id为1    条件只能是修改主键Id
	// user := User{Id:1}
	// if o.Read(&user) == nil {
	//     user.Name = "MyName1"
	//     if num, err := o.Update(&user); err == nil {
	//   		c.Ctx.WriteString(fmt.Sprintf("num: %d",num))
	//     }
	// }





	//删除  条件只能是修改主键Id
	// if num, err := o.Delete(&User{Id: 1}); err == nil {
	//     c.Ctx.WriteString(fmt.Sprintf("num: %d",num))
	// }



	//原生读取
	var maps []orm.Params
	num,err := o.Raw("select * from user where age = 28").Values(&maps)
	if err == nil && num > 0 {
	    c.Ctx.WriteString(fmt.Sprintf("%v",maps[0]["name"])) // slene
	}


	//构造查询
	//
	var users []User
	qb, _ := orm.NewQueryBuilder("mysql")
	qb.Select("name").From("user").Where("age = ?").Limit(2).Offset(2)
	// 导出SQL语句
	sql := qb.String()
	//
	o.Raw(sql,28).QueryRows(&users)
	c.Ctx.WriteString(fmt.Sprintf("%v",users))


	








}



